package com.frontier42.keepass.ant;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.SecureRandom;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
public class UrlStreamHelper{
/*
private static final String TRUSTSTORE_FILE = "C:/temp/client-truststore.jks";
private static final String TRUSTSTORE_PASSWORD = "changeit";
private static final String TRUSTSTORE_TYPE = "jks";
private static final String KEYSTORE_FILE = "C:/temp/client-keystore.jks";
private static final String KEYSTORE_PASSWORD = "changeit";
private static final String KEYSTORE_TYPE = "jks";
*/
private File truststore;
private String truststoreType="jks";
private String truststorePassword;
private File keystore;
private String keystoreType="jks";
private String keystorePassword;
private String sslProtocol="TLSv1.2";
public File getTruststore() {
return truststore;
}
public void setTruststore(File truststore) {
this.truststore = truststore;
}
public String getTruststoreType() {
return truststoreType;
}
public void setTruststoreType(String truststoreType) {
this.truststoreType = truststoreType;
}
public String getTruststorePassword() {
return truststorePassword;
}
public void setTruststorePassword(String truststorePassword) {
this.truststorePassword = truststorePassword;
}
public File getKeystore() {
return keystore;
}
public void setKeystore(File keystore) {
this.keystore = keystore;
}
public String getKeystoreType() {
return keystoreType;
}
public void setKeystoreType(String keystoreType) {
this.keystoreType = keystoreType;
}
public String getKeystorePassword() {
return keystorePassword;
}
public void setKeystorePassword(String keystorePassword) {
this.keystorePassword = keystorePassword;
}
public String getSslProtocol() {
return sslProtocol;
}
public void setSslProtocol(String sslProtocol) {
this.sslProtocol = sslProtocol;
}
protected KeyManager[] getKeyManagers(String keyStoreType, InputStream keyStoreFile, String keyStorePassword) throws GeneralSecurityException, IOException {
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(keyStoreFile, keyStorePassword.toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keyStore, keyStorePassword.toCharArray());
return kmf.getKeyManagers();
}
protected TrustManager[] getTrustManagers(String trustStoreType, InputStream trustStoreFile, String trustStorePassword) throws GeneralSecurityException, IOException {
KeyStore trustStore = KeyStore.getInstance(trustStoreType);
trustStore.load(trustStoreFile, trustStorePassword.toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(trustStore);
return tmf.getTrustManagers();
}
protected SSLContext createSSLContext() throws GeneralSecurityException, IOException {
SSLContext sslcontext = SSLContext.getInstance(getSslProtocol());
InputStream trustStoreInputStream = null;
InputStream keyStoreInputStream = null;
try {
trustStoreInputStream= new FileInputStream(getTruststore());
keyStoreInputStream=new FileInputStream(getKeystore());
TrustManager[] trustManagers = getTrustManagers(getTruststoreType(), trustStoreInputStream, getTruststorePassword());
KeyManager[] keyManagers = getKeyManagers(getKeystoreType(), keyStoreInputStream, getKeystorePassword());
sslcontext.init(keyManagers, trustManagers, new SecureRandom());
} finally {
if (trustStoreInputStream!=null)trustStoreInputStream.close();
if (keyStoreInputStream!=null)keyStoreInputStream.close();
}
return sslcontext;
}
protected void setSSLSocketFactory(URLConnection conn) throws GeneralSecurityException, IOException {
if (conn instanceof HttpsURLConnection) {
SSLContext context = createSSLContext();
SSLSocketFactory sf = context.getSocketFactory();
((HttpsURLConnection) conn).setSSLSocketFactory(sf);
((HttpsURLConnection) conn).setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
}
}
public InputStream openStream(URL url) throws IOException, GeneralSecurityException {
URLConnection conn = url.openConnection();
setSSLSocketFactory(conn);
return conn.getInputStream();
}
}